SViewFrame for Android 在SViewBase的基础上增加了模型属性操作、动画播放,测量,批注,漫游等功能的操作界面, 方便用户快速集成。
仅需要基本的浏览功能或需要个性化搭建展示界面的用户, 可选择 SViewBase for Android 集成控件
集成之前需要熟悉集成环境以便快速准确的集成相关功能界面。详细集成准备如下所示:
集成环境
SViewBase for Android 开发库集成需要的环境:
  • 开发环境:JDK7或以上版本
  • 开发工具:Android Studio或Eclipse
  • 运行环境: Android4.0以上的设备
SDK包解压SDK后得到以下内容:
其中Eclipse文件夹包含了Eclipse开发所需要的工程文件,Android Studio 文件夹包含了Android Studio所需的文件, Demo包含了Eclipse和Android Studio演示工程。接下来分别说明如何将控件集成到您的Android studio 工程和 Eclipse工程中。
Android Studio集成
控件资源 : Android Studio文件夹下的内容为Android Studio开发所需的SDK文件
打开Android Studio,将sviewframe.aar添加到您工程的libs文件夹下。如图所示:
修改app 下的build.gradle 配置文件添加
repositories {
	flatDir {
	 dirs 'libs'
	 }
}
这个是添加一个本地仓库,并把libs目录作为仓库的地址。
修改dependencies : compile(name: 'sviewframe', ext: 'aar'),其中name就是libs目录下sviewframe.aar文件名称,ext是其扩展名。
添加工程所应用的jar包 : 选择你的project 鼠标右键选择【open Module Settings】
选择你的module Dependencies 选项卡,选择+号,选择【File dependency】 找到需要导入的jar包,点击ok
点击Rebuild Project按钮重新构建工程
注意事项
根据您的工作环境不同,可能会遇到以下问题
若遇到aapt finished with non-zero exit value 1 异常,请将SDK的build.gradle中的 buildToolsVersion 设置为与app中build.gradle文件的buildToolsVersion相同,然后Rebuild Project。
若遇到module 合并时的重名冲突问题,请尝试重命名冲突的文件并Rebuild Project。请注意SDK要求java1.7以上的环境。
你需要删除support-v4:23.2.0 .重新添加你环境下的V4包。方法同3.2.2 选择Library dependency。
如果提示:mergeDebugResources AAPT err
你可以在app 下的build.gradle 文件下添加
aaptOptions.cruncherEnabled = false
aaptOptions.useNewCruncher = false
						
Eclipse集成
Eclipse文件夹下的内容为Eclipse开发所需的SDK文件,开发包内容如下。
控件资源:ADT文件夹中asserts包含了控件所需的资源,libs文件夹包含了控件所需jar包和so动态库,其他文件为工程附件文件,用户不需要关心。
资源导入,将下载的SDK导入到Eclipse,具体操作方法为:
File选择【Import】,然后打开Android,选择【Existing Android Code Into Workspace】, 点击下一步,在RootDirectory中填入SDK的具体路径,点击完成。
  
主工程(开发者自己的APP工程)依赖SDK,打开主工程属性(Properties),定位到Android,然后在Libray中选择Add,选择刚才导入的工程Library工程。
  
如果自己创建的工程未包含android-support-v4.jar,请从我们的Demo工程中复制。
将Asserts 目录下的SViewData文件夹拷贝到您的工程中。
注意:我们不建议直接将SDK内容复制到主工程的方式,这样后续SDK升级会比较麻烦,也容易遗漏一些文件的升级(比如res目录)
主体功能集成
应用权限声明
由于控件需要SDCard读写,录音等权限,请在AndroidManifest里面加入
						
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CHANGE_CONFIGURATION" />							
<uses-feature android:glEsVersion="0x00020000" />
代码混淆
如果您的App开启了混淆,那么您需要在您的混淆配置文件中添加如下配置:
						
-keep  public  class ht.svbase.model.SShape {
	public <init>();							
	public void setID(int );
	public void setName(java.lang.String) ;
}

-keep  public  class ht.svbase.model.SModel {
   public <init>();
   public void setID(int);
   public void setName(java.lang.String) ;
   public void setPlacePath(java.lang.String);
   public void addSubModel(ht.svbase.model.SModel ) ;
   public void addBody(ht.svbase.model.SBody) ;
   public void setModleViews(int[] ,java.lang.String[] ) ;
}

-keep  public   class ht.svbase.model.SBody {
   public <init>();
   public void setID(int );
   public void setName(java.lang.String) ;
   public void addFace(ht.svbase.model.SFace );
   public void addEdge(ht.svbase.model.SEdge );
}

-keep public   class ht.svbase.model.SFace {
   public <init>();
   public void setID(int );
   public void setName(java.lang.String) ;
   public void addEdge(ht.svbase.model.SEdge) ;
}
控件资源初始化
在创建SViewFrame控件对象之前,需要初始化SViewFrame 所需的字体、图片等资源和渲染所需的OpenGLES版本等信息。 此过程在Android的Application类中进行,此代码可以从Demo工程拷贝,根据需要做配置修改。基本流程如下:
public void initSViewFrameConfig () {
	SViewFrameConfig config = SViewFrame.getSViewConfig();
	config.setApplication(this);
	String assertDataPath = "SViewData";
	String workingPath = appWorkingPath;
	config.setAssertDataPath(assertDataPath);
	config.setWorkingPath(workingPath);
	config.setAppName(Name);
	int language = SViewFrameConfig.LANGUAGE_CH;
	String internationalLanguage = Locale.getDefault().getCountry();
	if (internationalLanguage.toLowerCase().equals("us")
			|| internationalLanguage.equals("en")) {
	   language = SViewFrameConfig.LANGUAGE_EN;
	}
	config.setLanguage(language);
	config.setGLESVersion(SViewFrameConfig.GLESVERSION20);
	SViewFrame.loadConfig();
}
由于拷贝后的资源文件存储在SDCard中,此拷贝过程可以在新版本第一次打开时执行一次即可。 可以参考Demo程序的代码进行判断是否是第一次运行。
License授权设置
LicenseManager.setLicenceKey("M2VURUFPMCJEVHJPEgQNHhZDbFRoT1YhQ01JT1VFZGVURUFPPk1GTmheRklrTVNPRC1qT05FU11CWWwJQgA=");
调用方法
SViewFrame控件运行截图如下,包含三个主要区域:
Quickbar菜单,包含复位、视图、着色模式、装配树和漫游等操作的菜单。
CommandBar菜单,包含批注、手势批注、剖视、爆炸、测量、动画和考试培训等操作的菜单。
三维展示和触摸操作区域,通过触摸操作来实现模型的控制。
SViewFrame对象支持通过xml布局文件和代码两种方式初始化,这里提供通过xml布局文件初始化的流程。
将以下代码添加到xml布局文件中
						 
<include
 android:id="@+id/sviewframe_view"
 layout="@layout/sview_frame_layout" />
						
布局预览效果如下图
根据id查找SViewFrame对象
						 
SViewFrame sViewFrame = (SViewFrame) findViewById(R.id.sviewframe_view);
//初始化quickBar菜单,需要显示调用,否则可能会出现菜单点击无效的情况
sViewFrame.getQuickBar();
//初始化commandBar菜单,需要显示调用,否则可能会出现菜单点击无效的情况
sViewFrame.getCommandBar();
配置SViewFrame控件运行参数
SViewFrame 支持设置浏览时设置剔除模式、剔除比例、是否显示旋转中心点、设置默认观察模式和默认模型朝向等参数,使用方式如下:
						 
sViewFrame = (SViewFrame) findViewById(R.id.sviewframe_view);
if (sViewFrame != null) {
    SViewFrameParameters groupParameters = sViewFrame.getSViewFrameParameters();
    groupParameters.setsView(sViewFrame.getSView());
    //------------以下参数根据集成实际情况进行设置--------//
    // 设置显示旋转中心
    groupParameters.setShowRotateCenter(true);
     // 设置提出剔除百分比为0
    groupParameters.setRemoveSize(0);
     // 设置坐标轴显示位置
    groupParameters.setAxisPos(AxisPos.LEFTDOWN);
    // 设置观察模式
    groupParameters.setDefaultOrbitMode(SOrbitMode.ORBIT_3DC);
    // 设置使用计算属性
    groupParameters.setUseComputeProperty(false);
    // 设置使用实例属性
    parameters.setUseInstanceProperty(true);
      // 设置使用原型属性
    parameters.setUsePrototypeProperty(false);
    //------------end--------//
    sViewFrame.loadParameters();
  }
打开和关闭模型:
通过Uri 对象传入的路径来打开指定的三维模型,代码如下:
Uri uri = Uri.parse(modelPath);
 sViewFrame.openUri(uri);
当您不想显示模型时,可以使用如下代码:
sViewFrame.close();
SViewFrame对象销毁
当您需要销毁SViewFrame对象时,请调用onDestroy()接口来释放控件管理的C++对象资源。
也可以采取单开进程的方法使用SViewFrame控件,具体操作如下:
在AndroidManifest.xml 文件中加载SView控件的Activity 中添加 android:process=":sview"
			
<activity
   android:name=".DemoActivity"
   android:label="@string/app_name" 
   android:configChanges="orientation|keyboardHidden|screenSize"
   android:launchMode="singleTask"
   android:process=":sview"
   android:windowSoftInputMode="adjustResize">
   <intent-filter>
   <action android:name="android.intent.action.MAIN" />
   <category android:name="android.intent.category.LAUNCHER" />
   </intent-filter>
</activity>
在该ACtivity销毁时使用android.os.Process.killProcess(android.os.Process.myPid());
@Override
protected void onDestroy() {
	super.onDestroy();
	sViewFrame.getSView().removeListener(readListener);
	sViewFrame.onDestroy();
	android.os.Process.killProcess(android.os.Process.myPid());
}
常见问题
  • 集成控件后,能够显示菜单但是模型显示界面为黑色。
  • 这是由于SViewBase所依赖的C++动态库,没有打包进入您的apk导致,请清理工程重新生成apk再试。
  • 集成控件出现打开模型空白或者没有授权。
  • 可能的原因有两个:
    1).授权时间到期。请联系我们申请延长期限。
    2).so文件读取异常。集成初期一般为这个原因, 请检查是否存在多个存在so文件的文件夹:如同时存在x86.armeabi,armeabi-v7a,armeabi-v8a....,建议在性能要求不过分要求的情况下只保留armeabi-v7a即可。
    3).运行设备系统为64位导致。 可以在项目的gradle中增加强制使用armv7a下的so文件。参考代码如下:

                          defaultConfig {
                           //强制使用armv7下的so文件。解决64位机器加载so文件不成功的问题
                              ndk{
                                 abiFilters "armeabi-v7a"
                                 }
                               }
                          
查看SViewFrame接口文档